package br.uff.javaavancado.service;

import br.uff.javaavancado.controletransacao.Transacional;
import br.uff.javaavancado.dao.ClienteDAO;
import br.uff.javaavancado.dao.controle.FabricaDeDao;
import br.uff.javaavancado.dao.impl.ClienteDAOImpl;
import br.uff.javaavancado.exception.AplicacaoException;
import br.uff.javaavancado.exception.ObjetoNaoEncontradoException;
import br.uff.javaavancado.modelos.Cliente;
import br.uff.javaavancado.modelos.Pedido;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;

public class ClienteService extends BaseService implements Service, java.io.Serializable {

    private static final long serialVersionUID = 1L;
    private ClienteDAO clienteDAO;

    public ClienteService() {
        super(ClienteService.class);
        try {
            clienteDAO = FabricaDeDao.getDao(ClienteDAOImpl.class, Cliente.class);
        } catch (Exception e) {
        }
    }

    public Cliente autenticarCliente(String login, String senha) throws AplicacaoException {
        Cliente c = null;
        try {
            c = clienteDAO.getClientePorLogin(login);
            if (c != null && c.getSenha().equals(senha)) {
                if (!c.isAdministrador()) {
                    c = clienteDAO.getClienteComPedidoAberto(c);
                    if (c.getPedidoAberto() == null) {
                        c.setPedidoAberto(new Pedido());
                    }
                }
                return c;
            }
        } catch (ObjetoNaoEncontradoException e) {
            throw new AplicacaoException("Cliente nao encontrado");
        }
        return null;
    }

    @Transacional
    public Cliente salvar(Cliente cliente) {
        return clienteDAO.inclui(cliente);
    }

    @Transacional
    public void atualizar(Cliente cliente) {
        clienteDAO.altera(cliente);
    }

    @Transacional
    public void excluir(Cliente cliente) throws AplicacaoException {
        try {
            cliente = clienteDAO.getPorIdComLock(cliente.getId());
            clienteDAO.exclui(cliente);
        } catch (ObjetoNaoEncontradoException ex) {
            throw new AplicacaoException("Cliente nao encontrado");
        }
    }

    public List<Cliente> getListaCompleta() {
        return clienteDAO.getListaCompleta();
    }

    public List<Cliente> getTrackLista(Pedido pedido) {
        return clienteDAO.recuperaListaTrackSetor(pedido);
    }

    public List<Cliente> getTrackLista() {
        return clienteDAO.recuperaListaTrack();
    }
}
